#!/bin/rc
#
#  this file configures a boot program (/boot) for a kernel.
#
if(! ~ $#* 1){
	echo usage: mkboot file >[1=2]
	exit 1
}

cat <<'---'
#include <u.h>
#include <libc.h>
#include "../boot/boot.h"

Method	method[]={
---

#
#  configure all remote methods, i.e. all methods in the 'boot' section
#
#  EXAMPLE
#	boot
#		incon
#		9600
#		19200
#
../port/mkextract boot 0 $* | awk '{
	printf "	{ \""  "" $1 "\", "\
	"config" $1 ", "\
	"connect" $1 ", "
	print fieldn(2) " },"
	}

	func fieldn(n,	s,i)
	{
		s = $0
		while (n > 1) {
			sub(/^[ \t]*/, "", s)
			if (substr(s, 1, 1) == "\"") {
				sub(/^"[^\"]*"/, "", s)
			} else {
				sub(/^[^ \t]*/, "", s)
			}
			n--
		}
		sub(/^[ \t]*/, "", s)
		if (substr(s, 1, 1) == "\"") {
			i = index(substr(s, 2), "\"")
			if (i > 0)
				return substr(s, 1, i+1)
			else
				return s
		} else {
			sub(/[ \t].*/, "", s)
			return s
		}
	}'

cat <<'---'
	{ 0 },
};
---

awk '
	BEGIN	{ cpuflag = 0; bootprog = "boot"; bootdisk = "#S/sdC0/"; rootdir = "/root"; }
	$0 ~ "^boot" && $2=="cpu"\
		{ cpuflag = 1
		  if(NF == 4 && $3 == "boot")
			bootdisk = $4
		}
	$0 ~ "^boot" && $2=="rootdir" && NF==3\
		{ rootdir = $3 }
	$0 ~ "^boot" && ($2=="bboot" || $2=="romboot" || $2=="dosboot")\
		{ cpuflag = 1;  bootprog = $2; }
	$0 ~ "^boot" && $2=="boot" && NF==3\
		{ bootdisk = $3 }
	END 	{ print "int cpuflag = " cpuflag ";"
		  print "char* rootdir = \"" rootdir "\";"
		  print "char* bootdisk = \"" bootdisk "\";"
		  print "extern void " bootprog "(int, char**);"
		  print "void"
		  print "main(int argc, char **argv)"
		  print "{"
		  print "\t" bootprog "(argc, argv);"
		  print "}"
		}
' $1

#
#  configure in a cache file system if a 
# /386/bin/root appears in the bootdir section.
#
../port/mkextract bootdir 0 $* | awk '
	BEGIN			{ cfs = 0 }
	$1 ~ "bin/cfs$"	{ cfs = 1 }
	END			{ if(cfs)
					print "int (*cfs)(int) = cache;"
				  else
					print "int (*cfs)(int) = 0;"
				}
	'
